package com.group6.exam.common.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 数据库操作通用类
 * 
 * @author Gerry。
 * @since 2016年3月15日
 */
public class DBUtil implements Constant {

	/**
	 * 获取连接的方法
	 * 
	 * @return
	 */
	private static Connection getConnection() {
		Connection conn = null;

		try {
			Class.forName(DRIVER_CLASS);
			conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return conn;
	}

	/**
	 * 执行简单SQL指令的增，删，改操作
	 * 
	 * @param sql
	 *            调用处传入SQL指令
	 * @param parameters
	 *            与SQL指令参数对应数组对象
	 * @return 返回操作受影响的行数
	 */
	public static int executeUpdate(String sql, Object... parameters) {
		int row = 0;
		// 定义操作的对象句柄
		Connection conn = null;
		PreparedStatement pst = null;

		try {
			conn = getConnection();
			pst = conn.prepareStatement(sql);

			// 判断是否设置参数
			if (parameters != null && parameters.length > 0) {
				for (int i = 0; i < parameters.length; i++) {
					pst.setObject(i + 1, parameters[i]);
				}
			}

			row = pst.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeObject(pst,conn);
		}

		return row;
	}
	
	/**
	 * 执行简单查询SQL指令
	 * 
	 * @param sql
	 *            调用处传入SQL指令
	 * @param parameters
	 *            与SQL指令参数对应数组对象
	 * @return 返回查询的结果集合
	 */
	public static List<Map<String,Object>> executeQuery(String sql,Object...parameters) {
		List<Map<String,Object>> table = new ArrayList<Map<String,Object>>();
		
		// 定义操作的对象句柄
		Connection conn = null;
		PreparedStatement pst = null;
		ResultSet rs = null;

		try {
			conn = getConnection();
			pst = conn.prepareStatement(sql);

			// 判断是否设置参数
			if (parameters != null && parameters.length > 0) {
				for (int i = 0; i < parameters.length; i++) {
					pst.setObject(i + 1, parameters[i]);
				}
			}
			
			rs = pst.executeQuery();
			
			if (rs!=null) {
				// 把结果集转换为虚拟表
				ResultSetMetaData rsd = rs.getMetaData();
				// 获取表格的列数
				int count = rsd.getColumnCount();
				
				while(rs.next()) {
					// 创建存储当前遍历行数据的集合对象
					Map<String,Object> row = new HashMap<String, Object>();
					
					for(int i = 0 ;i<count;i++) {
						row.put(rsd.getColumnLabel(i+1), rs.getObject(rsd.getColumnLabel(i+1)));
					}
					
					// 把构建新行存储到table集合中
					table.add(row);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeObject(rs,pst,conn);
		}

		return table;
	}
	
	/**
	 * 释放资源的方法
	 * @param parameters
	 */
	private static void closeObject(Object...parameters) {
		if(parameters!=null  && parameters.length>0) {
			try {
				for(Object obj : parameters) {
					// 判断当前对象是否为某个对象的实例 instanceof
					if (obj instanceof ResultSet) {
						((ResultSet)obj).close();
					}
					
					if (obj instanceof PreparedStatement) {
						((PreparedStatement)obj).close();
					}
					
					if (obj instanceof Connection) {
						Connection conn = ((Connection)obj);
						
						if(conn!=null && !conn.isClosed()) {
							conn.close();
							conn = null;
						}
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	/*public static void main(String[] args) {
		System.out.println(DBUtil.executeQuery("select c.courseId,c.courseName,t.termname from course c,term t where t.termId = c.termId"));
	}*/

}
